import java.util.Scanner;

/**
 * Created by L.jp
 * Description:链接：https://www.nowcoder.com/questionTerminal/d83721575bd4418eae76c916483493de
 * 来源：牛客网
 *
 * 广场上站着一支队伍，她们是来自全国各地的扭秧歌代表队，现在有她们的身高数据，请你帮忙找出身高依次递增的子序列。 例如队伍的身高数据是（1、7、3、5、9、4、8），其中依次递增的子序列有（1、7），（1、3、5、9），（1、3、4、8）等，其中最长的长度为4。
 *
 * 输入描述:
 * 输入包含多组数据，每组数据第一行包含一个正整数n（1≤n≤1000）。
 *
 * 紧接着第二行包含n个正整数m（1≤n≤10000），代表队伍中每位队员的身高。
 *
 *
 * 输出描述:
 * 对应每一组数据，输出最长递增子序列的长度。
 * 要求：时间复杂度 O(n^2) 空间复杂度 O(n)
 * User: 86189
 * Date: 2022-04-15
 * Time: 18:42
 */
public class Main{
    /*  这道题是一道经典的动态规划问题，问题是一个数组的最长上升子序列的长度，要明确是严格上升的，也就是遵循单调递增的规则
        分解成子问题就是求以每一个下标结尾的当前的最长上升子序列的长度，直到遍历到下标为n-1的位置，我们返回最大值即可
    *
    * */
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()) {
            int n=scanner.nextInt();
            int[] arr = new int[n];
            for(int i = 0; i < n; i++){
                arr[i] = scanner.nextInt();
            }
            //定义dp数组
            int[] dp=new int[arr.length];
            //初始化，dp[0]表示数组以0下标的结尾的最长上升子序列的长度，很明显为1
            dp[0] =1;
         /*  构造dp数组
            首先数组每一个下标的位置i的最长上升子序列都是元素自己，所以默认最长上升子序列就是1
            那么第一遍遍历数组就是赋值数组，每一个位置都是1
            那么遍历数组第二遍就是找以每一个下标结尾的子数组的递增子序列，所以遍历的范围就是0~i,只要遇到比i位置小的元素，
            那么就说明这个j下标的元素可以加入上升子序列，所以就开始比较上升子序列的最大值，比较的是i位置本来的值和j下标元素+1的值
            代表着这个j下标的子序列的长度加上i，就可以组成一个新的上升子序列，长度就是+1,
            就这么循环到最后，每一个j位置的dp[j]即代表以j下标结尾的最长上升子序列的长度，也代表这最长上升子序列
            
            */
            int ret=1;
            for(int i = 1; i < arr.length; i++){
                //默认是1
                dp[i]=1;
                for(int j=0;j<i;j++){
                    //如果j下标元素小于i下标元素，让j下标的最长上升子序列长度+1和i下标的最长上升子序列长度比较
                    if(arr[j] < arr[i]){
                        //找到每一个以i结尾的最长上升子序列的长度
                        dp[i]=Math.max(dp[j]+1,dp[i]);  //括号里的dp[i]表示i与上一个j下标的最长上升子序列长度
                    }
                }
                //这里只维护一个最长上升子序列的长度，是全局的最长长度
                ret=Math.max(ret,dp[i]);
            }
            System.out.println(ret);
        }
    
    }
    //对于这个方法时间复杂度是0（n^2)

}
